package com.tms.quartz.service.impl;

import com.tms.quartz.service.TriggerService;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * @author jackie
 * @date 2020年6月30日
 */
@Service
public class TriggerServiceImpl implements TriggerService {

    @Autowired
    Scheduler scheduler;

    /**
     * 添加一个触发器
     *
     * @param triggerName  触发器名称
     * @param triggerGroup 触发器分组
     * @param cron         cron表达式
     * @param param        触发器map参数
     * @return trigger，失败返回null
     */
    @Override
    public CronTrigger addTrigger(String triggerName, String triggerGroup, String cron, Map<String, String> param) {
        // 表达式调度构建器
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
        //按新的cronExpression表达式构建一个新的trigger
        CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(triggerName, triggerGroup).withSchedule(scheduleBuilder).startNow().build();
        if (param != null) {
            trigger.getJobDataMap().putAll(param);
        }
        return trigger;
    }

    /**
     * 暂停指定触发器
     *
     * @param triggerName  触发器名称
     * @param triggerGroup 触发器分组
     * @return 成功返回true，失败返回false
     */
    @Override
    public boolean pauseTrigger(String triggerName, String triggerGroup) {
        try {
            scheduler.pauseTrigger(new TriggerKey(triggerName, triggerGroup));
        } catch (SchedulerException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 恢复指定触发器
     *
     * @param triggerName  触发器名称
     * @param triggerGroup 触发器分组
     * @return 成功返回true，失败返回false
     */
    @Override
    public boolean resumeTrigger(String triggerName, String triggerGroup) {
        try {
            scheduler.resumeTrigger(new TriggerKey(triggerName, triggerGroup));
        } catch (SchedulerException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 移除指定触发器
     *
     * @param triggerName  触发器名称
     * @param triggerGroup 触发器分组
     * @return 成功返回true，失败返回false
     */
    @Override
    public boolean removeTrigger(String triggerName, String triggerGroup) {
        try {
            scheduler.pauseTrigger(new TriggerKey(triggerName, triggerGroup));
            scheduler.unscheduleJob(new TriggerKey(triggerName, triggerGroup));
        } catch (SchedulerException e) {
            e.printStackTrace();
            return false;
        }
        return true;
    }

    /**
     * 启动所有任务触发器
     */
    @Override
    public void startAllTriggers() {
        try {
            if (!scheduler.isStarted()) {
                scheduler.start();
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 关闭所有任务触发器
     */
    @Override
    public void shutdownAllTriggers() {
        try {
            if (!scheduler.isShutdown()) {
                scheduler.shutdown();
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}
